/**
 * @file CRhoBrentAlg.hpp Deklarácia triedy CRhoBrentAlg.
 *
 * @author Peter Vagánek.
 * @date 11.4.2009.
 */

#ifndef CRHOBRENTALG_HEADER
#define CRHOBRENTALG_HEADER

#include "CRhoAlgCommon.hpp"

/**
 * @brief Trieda algoritmu Pollard-Rho s Brentovým algoritmom detekcie cyklov.
 * Trieda zapúzdruje metódy a dátové prvky potrebné pri výpočte diskrétneho logaritmu
 * v grupe bodov eliptickej krivky. Trieda využíva algoritmus známy pod menom Pollard-Rho.
 * Na detekciu kolízií vyžíva Brentov algoritmus pre detekciu cyklov v postupnostiach.
 * Implementácia je založená na knihe <i>Handbook of Elliptic and Hyperelliptic Curve
 * Cryptography</i> od H. Cohena.
 */
class CRhoBrentAlg : public CRhoAlgCommon {
public:
    /**
     * @brief Hlavná metóda spúšťajúca výpočet diskrétneho logaritmu.
     * Metóda pracuje na základe vopred inicializovaných nastavení kontextu, medzi ktoré patria parametre
     * krivky, generátor a bod, ktorého diskrétny logaritmus hľadáme.
     * Algoritmus počíta pseudonáhodnú postupnosť (deterministickú) bodov na eliptickej krivke, až kým
     * za pomoci Brentovho algoritmu neodhalí cyklus, resp. kolíziu bodov. Následne je zo získaných
     * koeficientov kolízie vypočítaný hľadaný diskrétny logaritmus.
     * @param[in] improved Ak je TRUE, pri výpočte je využitý vylepšený Brentov algoritmus (Podľa Cohena).
     * @param[out] vysledok Premenná typu big, do ktorej bude uložený výsledok v prípade úspechy výpočtu.
     * Pamäť musí byť vopred alokovaná!
     * @warning V prípade neúspechu výpočtu obsahuje premenná @a výsledok nedefinovanú hodnotu.
     * @return Vráti TRUE v prípade úspechu výpočtu, v opačnom prípade vráti FALSE.
     */
    static bool computeLogarithm(big vysledok, const bool improved = false);
};
#endif /* CRHOBRENTALG_HEADER */
